"use strict";

require("../__util__/test-init");

const chai = require("chai");
chai.config.includeStack = true;
require("chai").should();
const expect = require("chai").expect;

var nodeRequire = require("../../node-require");

function testNodeRequireInstall(options, expected) {
  let requireObj = {
    extensions: {},
  };

  options.require = requireObj;

  nodeRequire.install(options);

  for (let i = 0; i < expected.length; i++) {
    let ext = expected[i];
    expect(requireObj.extensions[ext]).to.be.a("function");
  }

  expected.sort();

  var actualKeys = Object.keys(requireObj.extensions).sort();
  expect(expected).to.deep.equal(actualKeys);
}

describe("node-require", function () {
  it("should consolidate using both extension and extensions", function () {
    testNodeRequireInstall(
      {
        extension: ".marko.xml",
        extensions: [".marko", ".html"],
      },
      [".marko.xml", ".marko", ".html"],
    );
  });

  it("should consolidate using only extensions", function () {
    testNodeRequireInstall(
      {
        extensions: [".marko", ".html"],
      },
      [".marko", ".html"],
    );
  });

  it("should consolidate using only extension", function () {
    testNodeRequireInstall(
      {
        extension: ".marko.xml",
      },
      [".marko.xml"],
    );
  });

  it("should consolidate using extension and empty array of extensions", function () {
    testNodeRequireInstall(
      {
        extension: ".marko.xml",
        extensions: [],
      },
      [".marko.xml"],
    );
  });

  it("should consolidate with .marko when neither extension or extensions provided", function () {
    testNodeRequireInstall({}, [".marko"]);
  });

  it("should insert missing period into extensions", function () {
    testNodeRequireInstall(
      {
        extension: "marko.xml",
        extensions: ["html"],
      },
      [".marko.xml", ".html"],
    );
  });
});
